跳到主要内容

数据表(Table)

数据表是所有数据库开发者打交道最多的数据管理层级,它的原理非常简单,就是用表格的形式,描述数据。

Table

在这里,我们应当对如下的几个术语建立基本的了解,他们是未来我们深入于原理与内核的重要基础:

  • 关系(Relation)
    代表整张数据表(Table)
  • 元组(Tuble)
    数据表中的一行(Rows)
  • 属性(Attribute)
    数据表中的一列(Column)

而后面所介绍的各种 SQL 语句,自逻辑上看,就是对于数据表的操作(在这里,你可以想象你是在使用代码,而不是鼠标在帮你使用 Excel 软件)。

创建数据表

一般而言,想要创建一张数据表,则需要使用 CREATE TABLE 语句,让我们继续发挥我们的想象力,假定我们需要存储一组书籍的名称,作者与价格,数据表的名称为“book”,则可以使用如下的语句:

CREATE TABLE book (
name TEXT, /* 书籍的名称 */
author TEXT, /* 作者的姓名 */
price INTEGER /* 书籍的价格 */
);

而如果我们希望描述一款数据库软件的基本情况(如 PostgreSQL),那么我们可以尝试使用如下的语句:

CREATE TABLE database_soft (
name TEXT, /* 数据库软件的名称 */
author TEXT, /* 数据库软件的作者 */
describle TEXT /* 数据库软件的简介 */
);

而在创建之后,我们可以尝试观察数据表的结构,这里我们假定你正在使用 psql 工具,则使用 \d 指令,可以查看到这两张表的情况:

Observing-the-structure

可以发现,psql 反馈给我们的是:

# 可以思考为什么反馈信息里面没有包含“数据表所存放的数据库”
# 答案:因为我们使用 psql 连接 PostgreSQL 的时候,就已经指定了数据库

Table "数据表所对应的数据模式.数据表名称"
|列名称|该列所存储的数据类型|排序规则|是否可以为空|默认值|

其中,在当下的阶段,我们只需要关心前面的两项内容(即数据列的名称与数据类型)即可,而后面的三项(排序规则,是否可以为空,默认值),则留待后面阐述。

PostgreSQL 中的数据类型简介

在前面的案例当中,我们可以发现,CREATE TABLE 实际上就是一条对于数据表内部属性的描述语句,而根据不同场景下面的不同数据,我们会设计不同的结构加以描述,而具体将其分解为怎样的属性,则取决于我们的经验与应用的需求(这是一个时间、耐心与积累的问题)。

而对 PostgreSQL 当中的数据类型建立了解,可以更好地帮助我们去了解怎样去描述一个数据对象,进而简化我们的工作,对于当下阶段的我们而言,首先需要了解到一件重要的事情:

提示

记住所有的数据类型没有必要
PostgreSQL 的拓展系统对于引入新的数据类型保持着良好的支持,加之当前的发行版本中已经设立了大量的数据类型,因此如果尝试去记住当前所有的数据类型的话,一方面工作量大,消耗时间,而另一方面也容易遗忘,且难以适应新数据类型加入的情况(在 PostgreSQL 中引入新数据类型是非常常见的事情),因此即用即查,具体情况具体分析才是正途

在这个基础上,让我们来对 PostgreSQL 的数据类型做一个大体的审视,我将其归纳为如下的几个类别:

  • 数字类型
    数字类型被用于描述数据对象的某一项可以使用数字表达的属性,如书籍的价格,股票的价格等,而在这个基础上,它又可以划分为整数与浮点数两类,具体则可以对应到如下的类型:
    • INTEGER
      在 PostgreSQL 中最常见的表示整数的数据类型
    • DOUBLE PRECISION
      在绝大多数场景中可用于表达小数
  • 字符串类型
    字符串类型用于描述字符串,可以对应到如下的类型:
    • TEXT
      PostgreSQL 中最适合的通用字符串数据类型,对于长文本存储提供了非常好的支持
  • 复合类型
    复合类型实际上就是对于前面两者的二次整合,它实际上就是一张数据表
  • 具有某种特定格式的类型
    这种数据类型为某一类格式的数据而设定,如 PostgreSQL 的 json 类型就为符合 json 格式的字符串而设置,进而便利了管理 json 文档的工作(同样也适用于 xml 类型,其为 xml 文档而提供支持),以及为管理时间数据而设立的 timestamp 等时间数据类型。
    学习他们最好的办法就是即用即查

而在实践中,复合类型与为某种特定格式数据而服务的类型常常混合出现,因此很多情况下其实难以对数据类型进行直观的分类,我们将在后续的文档里面对几个具体的场景展开分析,进而加强对于这方面的理解。

删除数据表

对于希望删除的数据表,使用 DROP TABLE 就可以完成我们的工作,参考如下的代码:

CREATE TABLE example (id INTEGER);
DROP TABLE example;